import { Injectable } from '@angular/core';

@Injectable({
    providedIn: 'root'
})
export class UtilService {

    constructor() { }
    /**
     * 函数节流函数在给定的时间间隔内只允许你提供的回调函数执行一次，
     * 以此降低它的执行频率,当遇到高频触发的事件时，这样的限制显得尤为重要。
     * 示例：
     * var myEfficientFn = debounce(function() {
     *       // All the taxing stuff you do
     * }, 250);
     * window.addEventListener('resize', myEfficientFn);
     *
     * @param  {[function]} func      [函数]
     * @param  {[number]} wait        [毫秒]
     * @param  {[bool]} immediate     [立即执行一次]
     * @return {[function]}           [返回一个降频后的函数]
     */
    debounce(func, wait = 200, immediate = true) {
        let timeout;
        return function () {
            const context = this,
                args = arguments;
            const later = function() {
                timeout = null;
                if (!immediate) {
                    func.apply(context, args);
                }
            };
            const callNow = immediate && !timeout;
            clearTimeout(timeout);
            timeout = setTimeout(later, wait);
            if (callNow) {
                func.apply(context, args);
            }
        };
    }
}
